Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_plugin_signature.py

Displaying Raw • Download


tests/backend/test_plugin_signature.py c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 3.27 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787io
Tff7b72import T7ee787json
Tff7b72import T7ee787zipfile

Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_rsg Tff7b72import Te6edf3create_rsg
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_signature Tff7b72import Tb4b4b4(
Te6edf3PRIMARY_SIGNATURE_FILETb4b4b4,
Te6edf3build_canonical_zipTb4b4b4,
Te6edf3canonical_dir_payloadTb4b4b4,
Te6edf3require_valid_signatureTb4b4b4,
Te6edf3verify_dir_signatureTb4b4b4,
Te6edf3verify_zip_signatureTb4b4b4,
Te6edf3write_dir_signatureTb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ff_write_plugin_dirTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3pathTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.signedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSignedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjsTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tb4b4b4(Te6edf3path Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3manifestTb4b4b4)Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3frontend Tff7b72= Te6edf3path Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"
Te6edf3frontendTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3frontend Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffexport default Tffd700{}Ta5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_canonical_dir_zip_roundtripTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3plugin_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpluginTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Te6edf3plugin_dirTb4b4b4)
Te6edf3payload Tff7b72= Te6edf3canonical_dir_payloadTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Te6edf3names Tff7b72= Tffa657sortedTb4b4b4(Te6edf3archiveTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Te6edf3PRIMARY_SIGNATURE_FILE Tff7b72not Tff7b72in Te6edf3names


Tff7b72def Td2a8fftest_unsigned_ok_invalid_blocksTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3plugin_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpluginTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Te6edf3plugin_dirTb4b4b4)
Te6edf3info Tff7b72= Te6edf3verify_dir_signatureTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3infoTff7b72.Td2a8ffpresent Tff7b72is Tff7b72False
Te6edf3require_valid_signatureTb4b4b4(Te6edf3infoTb4b4b4)

Te6edf3write_dir_signatureTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff" Tff7b72* T79c0ff70Tb4b4b4)
Te6edf3bad Tff7b72= Te6edf3verify_dir_signatureTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3badTff7b72.Td2a8ffpresent Tff7b72is Tff7b72True
Tff7b72assert Te6edf3badTff7b72.Td2a8ffvalid Tff7b72is Tff7b72False
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffinvalid plugin signatureTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3require_valid_signatureTb4b4b4(Te6edf3badTb4b4b4)


Tff7b72def Td2a8fftest_signed_dir_and_zip_installTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3plugin_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpluginTa5d6ff"
Te6edf3_write_plugin_dirTb4b4b4(Te6edf3plugin_dirTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3canonical_dir_payloadTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Te6edf3write_dir_signatureTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4, Te6edf3create_rsgTb4b4b4(Te6edf3payloadTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4)
Te6edf3info Tff7b72= Te6edf3verify_dir_signatureTb4b4b4(Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3infoTff7b72.Td2a8ffvalid Tff7b72is Tff7b72True

Te6edf3entries Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4: Tb4b4b4(Te6edf3plugin_dir Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Tb4b4b4: Tb4b4b4(Te6edf3plugin_dir Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
T8b949e# Sign zip using zip canonical payload without signature file.
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_signature Tff7b72import Tb4b4b4(
Te6edf3canonical_zip_payload_from_bytesTb4b4b4,
Te6edf3embed_signature_in_zip_bytesTb4b4b4,
Tb4b4b4)

Te6edf3unsigned_zip Tff7b72= Te6edf3build_canonical_zipTb4b4b4(Te6edf3entriesTb4b4b4)
Te6edf3signed_zip Tff7b72= Te6edf3embed_signature_in_zip_bytesTb4b4b4(
Te6edf3unsigned_zipTb4b4b4,
Te6edf3create_rsgTb4b4b4(Te6edf3canonical_zip_payload_from_bytesTb4b4b4(Te6edf3unsigned_zipTb4b4b4)Tb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3zip_info Tff7b72= Te6edf3verify_zip_signatureTb4b4b4(Te6edf3signed_zipTb4b4b4)
Tff7b72assert Te6edf3zip_infoTff7b72.Td2a8ffvalid Tff7b72is Tff7b72True

Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(Te6edf3signed_zipTb4b4b4)
Tff7b72assert Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffcom.example.signedTa5d6ff"
Tff7b72assert Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffsignatureTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffvalidTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True

Te6edf3bad_zip Tff7b72= Te6edf3embed_signature_in_zip_bytesTb4b4b4(Te6edf3unsigned_zipTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffyTa5d6ff" Tff7b72* T79c0ff80Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffinvalid plugin signatureTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(Te6edf3bad_zipTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────